package com.zyong.design.pattern.template.case3;

/**
 * @program: zyong-design-pattern
 * @ClassName: AbstractClass
 * @author: zyong
 * @create: 2024-04-27 12:33
 */
public abstract class AbstractClass {
    /**
     * 模板方法
     * 定义基本方法的执行顺序
     */
    public final void service() {
        if (!isVip()) {
            getNum();
            doWait();
        }
        doService();
        doExit();
    }

    /**
     * 钩子方法
     * @return
     */
    public boolean isVip() {
        return false;
    }

    /**
     * 取号
     * 基本方法（实现方法）
     */
    public void getNum() {
        System.out.println("取号");
    }

    /**
     * 排队
     * 基本方法（实现方法）
     */
    public void doWait() {
        System.out.println("排队");
    }

    /**
     * 办理具体业务，子类实现
     * 抽象方法
     */
    public abstract void doService();

    /**
     * 离开银行
     * 基本方法（实现方法）
     */
    public void doExit() {
        System.out.println("离开银行");
    }
}
